package com.zenithmind.user.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zenithmind.user.pojo.domain.Tenant;
import com.zenithmind.user.pojo.query.TenantQuery;
import com.zenithmind.user.pojo.vo.TenantVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * 租户Mapper接口
 * 
 * @author ZenithMind
 * @since 2024-06-30
 */
@Mapper
public interface TenantMapper extends BaseMapper<Tenant> {

    /**
     * 分页查询租户信息
     * 
     * @param page 分页对象
     * @param query 查询条件
     * @return 租户信息分页结果
     */
    IPage<TenantVO> selectTenantPage(Page<TenantVO> page, @Param("query") TenantQuery query);

    /**
     * 根据租户编码查询租户
     * 
     * @param tenantCode 租户编码
     * @return 租户信息
     */
    @Select("SELECT * FROM tenant WHERE tenant_code = #{tenantCode} AND is_deleted = 0")
    Tenant selectByTenantCode(@Param("tenantCode") String tenantCode);

    /**
     * 查询即将到期的租户（7天内）
     * 
     * @return 即将到期的租户列表
     */
    List<TenantVO> selectExpiringSoonTenants();

    /**
     * 查询已过期的租户
     * 
     * @return 已过期的租户列表
     */
    List<TenantVO> selectExpiredTenants();

    /**
     * 更新租户用户数量
     * 
     * @param tenantId 租户ID
     * @param userCount 用户数量
     * @return 更新结果
     */
    @Update("UPDATE tenant SET current_users = #{userCount} WHERE id = #{tenantId}")
    int updateUserCount(@Param("tenantId") String tenantId, @Param("userCount") Integer userCount);

    /**
     * 更新租户存储使用量
     * 
     * @param tenantId 租户ID
     * @param storageUsed 已用存储
     * @return 更新结果
     */
    @Update("UPDATE tenant SET storage_used = #{storageUsed} WHERE id = #{tenantId}")
    int updateStorageUsed(@Param("tenantId") String tenantId, @Param("storageUsed") Long storageUsed);

    /**
     * 增加租户存储使用量
     * 
     * @param tenantId 租户ID
     * @param increment 增量（可以为负数）
     * @return 更新结果
     */
    @Update("UPDATE tenant SET storage_used = storage_used + #{increment} WHERE id = #{tenantId}")
    int incrementStorageUsed(@Param("tenantId") String tenantId, @Param("increment") Long increment);

    /**
     * 统计租户数量按状态分组
     * 
     * @return 统计结果
     */
    List<TenantVO> selectTenantStatsByStatus();

    /**
     * 统计租户数量按类型分组
     * 
     * @return 统计结果
     */
    List<TenantVO> selectTenantStatsByType();
}
